public class 爱吃香蕉的珂珂 {
    public int minEatingSpeed(int[] piles, int h) {
        //找到最大值[1,max]是二分的范围
        int n = piles.length;
        int max = 0;
        for(int pile : piles){
            max = Math.max(pile,max);
        }
        //进行二分
        int l = 1;
        int r = max;
        while(l < r){
            //位运算可以快两秒
            int mid = (l + r) >> 1;
            if(f(piles,mid) <= h){
                r = mid;
            }else{
                l = mid + 1;
            }
        }
        return l;
    }

    private int f(int[] piles, int speed) {
        int ret = 0;
        for(int pile : piles){
            //这种涉及到符号优先级
            // ret += (pile / speed) + pile % speed == 0 ? 0 : 1;
            //以下速度比较慢
            // ret += (pile / speed);
            // ret += pile % speed == 0 ? 0 : 1;
            //这种在两者都是非负数的情况下可以向上取证, 使用这个更快
            ret += (pile + speed - 1) / speed;
        }
        return ret;
    }

}
